package junior.util.lambda;

import java.util.Collection;

/**
 * 常用的过滤函数闭包
 * 
 * @author ZhangXiaoye
 * @date 2016年7月13日 上午9:41:04
 */
public class Filters {
	
	/**
	 * 包含
	 * 
	 * @param set
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:41:14
	 */
	public static <T> FuncIO<T, Boolean> in(final Collection<T> set){
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return set != null && set.contains(input);
			}
		};
	}
	
	/**
	 * 不包含
	 * 
	 * @param set
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:41:14
	 */
	public static <T> FuncIO<T, Boolean> ni(final Collection<T> set){
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return set == null || (! set.contains(input));
			}
		};
	}
	
	/**
	 * 相等
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:41:33
	 */
	public static <T> FuncIO<T, Boolean> eq(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@SuppressWarnings({ "unchecked", "rawtypes" })
			@Override
			public Boolean call(T input) throws RuntimeException {
				if(value instanceof Comparable){
					return ((Comparable) value).compareTo(input) == 0;
				}
				return value.equals(input);
			}
		};
	}
	
	/**
	 * 不等
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:41:33
	 */
	public static <T> FuncIO<T, Boolean> ne(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@SuppressWarnings({ "unchecked", "rawtypes" })
			@Override
			public Boolean call(T input) throws RuntimeException {
				if(value instanceof Comparable){
					return ((Comparable) value).compareTo(input) != 0;
				}
				return ! value.equals(input);
			}
		};
	}
	
	/**
	 * 小于
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:41:55
	 */
	public static <T extends Comparable<? super T>> FuncIO<T, Boolean> lt(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return value.compareTo(input) > 0;
			}
		};
	}
	
	/**
	 * 小于等于
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:42:09
	 */
	public static <T extends Comparable<? super T>> FuncIO<T, Boolean> le(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return value.compareTo(input) >= 0;
			}
		};
	}
	
	/**
	 * 大于
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:42:21
	 */
	public static <T extends Comparable<? super T>> FuncIO<T, Boolean> gt(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return value.compareTo(input) < 0;
			}
		};
	}
	
	/**
	 * 大于等于
	 * 
	 * @param value
	 * @return
	 * @author ZhangXiaoye
	 * @date 2016年7月13日 上午9:42:29
	 */
	public static <T extends Comparable<? super T>> FuncIO<T, Boolean> ge(final T value){
		if(value == null){
			throw new IllegalArgumentException("argument:value can not be null.");
		}
		return new FuncIO<T, Boolean>() {
			@Override
			public Boolean call(T input) throws RuntimeException {
				return value.compareTo(input) <= 0;
			}
		};
	}

}
